#include <stdio.h>  // 引入标准输入输出库
#include <stdlib.h> // 引入标准库，用于动态内存分配
#include <time.h>   // 引入时间库，用于生成随机数种子

#define SIZE_NUM 100 // 定义常量SIZE_NUM，表示成绩数组的大小


// 函数randnumscore：生成随机成绩并返回成绩数组的指针
int *randnumscore()
{
    // int array[50]; // 注释掉的代码，原意可能是定义一个大小为50的数组
    int *array = (int *)malloc(SIZE_NUM * sizeof(int)); // 动态分配一个大小为SIZE_NUM的整型数组
    srand(time(0)); // 设置随机数种子，使用当前时间

    // 循环生成随机成绩并存储到数组中
    for (int i = 0; i < SIZE_NUM; i++)
    {
        array[i] = rand() % 100 + 1; // 生成1到100之间的随机数
    }

    // 打印生成的成绩列表
    printf("成绩列表: [");
    for (int i = 0; i < SIZE_NUM; i++)
    {
        printf("%d， ", array[i]); // 打印每个成绩
    }
    printf("]\n"); // 结束成绩列表的打印

    return array; // 返回成绩数组的指针
}

// 函数cal：计算成绩数组的平均值和最大值
void cal(int *arr, int n, int *avg, int *max)
{
    int sum = 0; // 初始化总和为0
    *max = arr[0]; // 初始化最大值为数组的第一个元素

    // 循环遍历数组，计算总和和最大值
    for (int i = 0; i < n; i++)
    {
        sum += arr[i]; // 累加每个成绩
        if (arr[i] > *max) // 如果当前成绩大于最大值
        {
            *max = arr[i]; // 更新最大值
        }
    }

    *avg = sum / n; // 计算平均值
}

// 函数showScorce：显示成绩的分段统计
void showScorce(int *arr, int n)
{
    int fenduan[10] = {0}; // 初始化分段统计数组，大小为10

    // 循环遍历成绩数组，进行分段统计
    for (int i = 0; i < n; i++)
    {
        fenduan[(arr[i] - 1) / 10]++; // 根据成绩范围增加对应分段的计数
    }
    printf("\n分段统计:\n"); // 打印分段统计标题
    // 循环打印每个分段的统计结果
    for (int i = 0; i < 10; i++)
    {
        printf("%d-%d: ", i * 10 + 1, (i + 1) * 10); // 打印分段范围
        for (int j = 0; j < fenduan[i]; j++) // 打印每个分段的成绩数量
        {
            printf("*"); // 使用星号表示成绩数量
        }
        printf("(%d)", fenduan[i]); // 打印具体数量
        printf("\n"); // 换行
    }
}

// 主函数main：程序的入口
int main()
{
    int avg, max; // 定义变量用于存储平均成绩和最高成绩
    int *arr = randnumscore(); // 调用randnumscore函数生成随机成绩数组
    cal(arr, SIZE_NUM, &avg, &max); // 调用cal函数计算平均成绩和最高成绩

    // 打印最高成绩和平均成绩
    printf("\n最高成绩: %d\n", max);
    printf("平均成绩: %d\n", avg);

    showScorce(arr, SIZE_NUM); // 调用showScorce函数显示成绩分段统计

    return 0; // 程序正常结束
}
